還記得第一次用rails的時候被這火星文給震懾住
Rails.application.routes.draw do
resources :people #這是什麼意思??? :寫錯位置了吧?
end
一問才知道原來是symbol
那symbol是什麼呢?
在ruby裡面什麼東西都是物件
而symbol也只是個有名字的物件
你可以把它看成不能修改的字串
symbol vs. string
其實symbol在宣告的時候就已經在記憶體裡面佔有一席之地了!
然而string就像個無業遊民,每次叫他就又在另一個記憶體位址
p "hello".object_id #47132441787720
p "hello".object_id #47132441787480
p "hello".object_id #47132441787400
p :hello.object_id #1040988
p :hello.object_id #1040988
p :hello.object_id #1040988
上面的例子得知『在ruby每個字串都有不一樣的記憶體位置』
而:hello就是給hello一個專屬的記憶體位置
然而你也可以不透過symbol把"hello"存起來
a = "hello"
p a.object_id #47367933032220
p a.object_id #47367933032220
p a.object_id #47367933032220
會發現其實a透過『位址』去找值
就只是沒有個物件把它存起來罷了
ruby的參數是透過『傳址不傳值』這規則去實踐的
那怎麼用symbol?
在用之前需要知道symbol有一個特性,那就是不能修改
#你可以
p :hello.upcase #:HELLO
p :HELLO.downcase #:hello
p :hello.length #5
p :hello[0] #"h"
#不能夠
p :hello[0] = "i" #這樣會噴錯誤訊息
symbol使用時機?
因為symbol不能修改的特性
往往會應用在不用去修改的資料上(廢話
在hash的key就很常看到symbol的出現
my_symbol = { :hello => "symbol", "hello" => "string"}
p my_symbol[:hello] # "symbol"
p my_symbol["hello"] # "string"
symbol與string間的轉換
轉換方法有分為這幾種
#字串轉symbol
p "name".to_sym <=常用
p "name".intern
#symbol轉字串
p :name.to_s <=常用
p :name.id2name
範圍技轉symbol
在ruby有個指令叫冰凍字串
#frozen_string_literal: true #沒錯,連#也要給他打下去
s = "abc"
s[0] = "x" #會出錯
p s
#frozen_string_literal: true
可以把整個程式碼都冰凍住,不得修改
讓程式可以跑快一點 (現在的我也感覺不出來快多少 XD
有範圍技當然就有指定技囉!
s = "abc".freeze #.freeze就把字串凍住了!
s[0] = "x"
p s
總整理
symbol : 效能較佳 不能修改內容 轉字串用.to_s
string : 效能較差 可以修改內容 轉符號用.to_sym
效能有沒有差異大概也要寫到很大一包才有感覺吧?!